package mapdemo;

import org.junit.Test;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

/**
 * Created by IntelliJ IDEA.
 * User: jinshengyuan
 * Date: 2019-03-13
 * Time: 14:10
 * description: 迭代Map的方式
 *
 * 一般来讲使用entrySet的方式进行遍历是效率最高的，因为hashMap内部的存储结构就是基于Entry的数组，在用这种方式进行遍历时，只需要遍历一次即可。而使用其他方式的时间复杂度可以会提高.
 * 例如：keySet方式，每次都需要通过key值去计算对应的hash,然后再通过hash获取对应的结果值，因此效率较低。
 **/
public class MapIterate {
    static Map<String,Object> map = new HashMap();
    static {

        for (int i = 1; i <= 5 ; i++) {
            map.put("k" + i,"v" +i);
        }
        map.put("null","null");
        map.put(null,null);
        map.put("","");
    }


    /**
     * Iterator遍历：使用map.entrySet同时迭代出 key 和 value
     * 此种遍历方式效率最高，尤其是大容量的时候
     */
    @Test
    public void testOne(){
        for (Map.Entry<String, Object> objectEntry : map.entrySet()) {
            System.out.println(objectEntry.getKey()+"====="+objectEntry.getValue());
        }
    }

    /**
     * 二次取值方法1：使用map.keySet(),的到key，再根据key取出value
     */
    @Test
    public void testTwo(){
        for (String s : map.keySet()) {
            System.out.println(s+"-----"+map.get(s));
        }
    }

    /**
     * 二次取值方法2: 使用mpa.entrySet().iterator()迭代器进行迭代;
     */
    @Test
    public void testThree(){
       Iterator<Map.Entry<String,Object>> entryIterator =  map.entrySet().iterator();
       while (entryIterator.hasNext()){
            Map.Entry<String,Object> entry =  entryIterator.next();
           System.out.println(entry.getKey()+"============"+entry.getValue());
       }
    }

    /**
     * 根据map.values只遍历所有的value
     */
    @Test
    public void testFour(){
        for (Object o : map.values()) {
            System.out.println(o);
        }
    }

    /**
     * 根据Lambda表达式遍历，map.forEach
     */
    @Test
    public void testFive(){
        map.forEach((key,value) -> System.out.println(key+"----"+value));
    }
}
